package org.kiwi.job.core;

import lombok.Data;
import org.kiwi.job.util.MethodInvoker;

import java.io.Serializable;
import java.util.Date;

/**
 * @email jack.liu.19910921@gmail.com
 * Created by jack on 17/2/19.
 */
@Data
public class ScheduleJob implements Serializable {

    /**
     * 任务代码
     */
    private String jobCode;

    /**
     * 任务名称
     */
    private String jobName;

    /**
     * 任务组
     */
    private String jobGroup;

    /**
     * 任务描述
     */
    private String jobDesc;

    /**
     * 执行表达式，临时任务可以为空
     */
    private String jobCron;

    /**
     * 执行类或spring bean id
     */
    private String jobClass;

    /**
     * 执行方法
     */
    private String jobMethod;

    /**
     * 执行http接口path路径
     */
    private String httpPath;

    /**
     * groovy脚本(解决cron表达式局限性)
     */
    private String jobScript;

    /**
     * 任务状态(0:禁用 1:启用 2: 暂停 3:恢复)
     */
    private Byte jobStatus;

    /**
     * 是否支持多机运行，单机运行的任务会加redis分布式锁，每次任务只会由一台机器执行。
     */
    private Byte isConcurrent;

    /**
     * 参数执行的机器列表
     */
    private String jobPartitions;

    /**
     * 任务上次执行时间
     */
    private Date previousTime;

    /**
     * 任务下次执行时间
     */
    private Date nextTime;

    /**
     * 任务执行时间ms
     */
    private Long costTime;

    /**
     * 异常信息
     */
    private String exceptionDesc;

    /**
     * 触发IP
     */
    private String ipAddress;


    //执行方法
    MethodInvoker methodInvoker;

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;

        if (obj != null && obj instanceof ScheduleJob) {
            ScheduleJob job = (ScheduleJob) obj;
            if (jobCode.equals(job.getJobCode()) && jobName.equals(job.getJobName())
                    && jobGroup.equals(job.getJobGroup()) && jobDesc.equals(job.getJobDesc())
                    && jobCron.equals(job.getJobCron()) && jobClass.equals(job.getJobClass())
                    && jobMethod.equals(job.getJobMethod()) && httpPath.equals(job.getHttpPath())
                    && jobStatus.equals(job.getJobStatus()) && isConcurrent.equals(job.getIsConcurrent())
                    && jobPartitions.equals(job.getJobPartitions()) && jobScript.equals(job.getJobScript()))
                return true;
        }

        return false;
    }
}
